在使用 LLM 工具前,一定都要給模型一個「指示」,這個指示會影響模型最終的輸出,例如要求模型將文字輸出格式限制成 Json 或者 Markdown 語法,或者要求他將使用者輸入的文字做總結。
下面來講講 Prompt 的使用方法
from langchain_community.chat_models import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# 預先建立一個變數來儲存我們要改模型的指示
template = """請根據使用者給予的內容,給予實質的建議或者有用的回覆,回覆請使用繁體中文
Question: {question}
"""
llm = ChatOllama(
model="gemma2:2b",
base_url="http://127.0.0.1:11434"
)
"""
底下這邊比較特別,我們使用 "|" 這個符號來幫我們做資料導向
23 中我們將使用者的輸入蒐集起來並建立一個 dict
24 中套用 23 行的 dict 到 template 的變數中
25 行將上面的資料丟給 llm 做處理後丟改 26 行做輸出
"""
chain = (
{"question": RunnablePassthrough()}
| ChatPromptTemplate.from_template(template)
| llm
| StrOutputParser()
)
初始化完成後就可以開始問問題了
print(chain.invoke("我想要買一台筆電,但是不知道要選擇哪一台,可以給我一些建議嗎?"))
這就是用簡單的 Prompt 去輸出一個字串回覆
以上的範例是使用 Ollama 的 API 服務,那如果想用 OpenAI 或者我們在 Day 12 介紹的圖形化文字生成工具的話,其實也是很簡單的。
在上面我們使用 ChatOllama 的工具,在這邊我們改使用 ChatOpenAI 看看
from langchain_community.chat_models import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
template = """請根據使用者給予的內容,給予實質的建議或者有用的回覆,回覆請使用繁體中文
Question: {question}
"""
llm = ChatOpenAI(
api_key=<YOUR_API_KEY>
)
chain = (
{"question": RunnablePassthrough()}
| ChatPromptTemplate.from_template(template)
| llm
| StrOutputParser()
)
print(chain.invoke("我想要買一台筆電,但是不知道要選擇哪一台,可以給我一些建議嗎?"))
使用 OpenAI 的服務只要單純輸入 api_key 即可
但如果要用自己架設的文字生成服務的話,需要額外在終端中啟用 API 的擴充服務,所以將終端指令改成以下的樣子後直接執行 (記得讀取模型喔)
python server.py --extensions api --listen --api --api-port 5001 --trust-remote-code
可以看到中輸出有所變化,在 Log 中可以看到 OpenAI-compatible API URL 已經在 http://0.0.0.0:5001
上開放
在來將微調程式碼成下面的樣子,主要是要設定 openai_api_base
到我們的 api 端口上
如果不設定這個 openai_api_base
將指向 OpenAI 官方的服務 ,也就是 https://api.openai.com/v1
上
llm = ChatOpenAI(
openai_api_base="http://127.0.0.1:5001/v1",
openai_api_key="sk-111111111111111111111111111111111111111111111111"
)
這時我們重新執行 Python 檔,就可以得到我們本地語言模型的回覆了